package com.dw.example.activity;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.dw.example.BaseActivity;
import com.dw.example.R;
import com.dw.library.widget.Carousel;
import com.dw.library.widget.Carousel.LayoutParams;

public class Activity002 extends BaseActivity {
  private static final String TAG = "Activity002";
  
  private Carousel carousel;
  private int[] imgIds = { R.drawable.cat, R.drawable.hippo, R.drawable.monkey, R.drawable.mouse, R.drawable.panda, R.drawable.rabbit};
  private ImageAdapter mAdapter;

  @Override
  protected void initView() {
    carousel = (Carousel) findViewById(R.id.carousel);
    mAdapter = new ImageAdapter(this, imgIds, true);
    carousel.setAdapter(mAdapter);
  }

  @Override
  protected void initData() {
  }

  @Override
  protected void registListener() {
  }
  
  class ImageAdapter extends BaseAdapter {

    private Context mContext;
    private ImageView[] imgs;

    public ImageAdapter(Context c) {
      mContext = c;
    }
    
    public ImageAdapter(Context c, int[] imgIds, boolean reflected){
      this(c);
      setImages(imgIds, reflected);
    }

    public void setImages(int[] imgIds, boolean reflected) {

      final int reflectionGap = 4;

      int len = imgIds.length;
      imgs = new ImageView[len];
      Resources res = mContext.getResources();

      for (int i = 0; i < len; i++) {
        Bitmap originalImage = ((BitmapDrawable) res.getDrawable(imgIds[i])).getBitmap();

        if (reflected) {
          int width = originalImage.getWidth();
          int height = originalImage.getHeight();

          // This will not scale but will flip on the Y axis
          Matrix matrix = new Matrix();
          matrix.preScale(1, -1);

          // Create a Bitmap with the flip matrix applied to it.
          // We only want the bottom half of the image
          Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height / 2, width, height / 2, matrix, false);

          // Create a new bitmap with same width but taller to fit
          // reflection
          Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);

          // Create a new Canvas with the bitmap that's big enough for
          // the image plus gap plus reflection
          Canvas canvas = new Canvas(bitmapWithReflection);
          // Draw in the original image
          canvas.drawBitmap(originalImage, 0, 0, null);
          // Draw in the gap
          Paint deafaultPaint = new Paint();
          deafaultPaint.setColor(Color.TRANSPARENT);
          canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
          // Draw in the reflection
          canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

          // Create a shader that is a linear gradient that covers the
          // reflection
          Paint paint = new Paint();
          LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
              + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
          // Set the paint to use this shader (linear gradient)
          paint.setShader(shader);
          // Set the Transfer mode to be porter duff and destination in
          paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
          // Draw a rectangle using the paint with our linear gradient
          canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);

          originalImage = bitmapWithReflection;
        }

        ImageView imageView = new ImageView(mContext);
        imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        imageView.setImageBitmap(originalImage);

        // //////imageView.setLayoutParams(new CarouselOld.LayoutParams(120,
        // 180));
        // //////imageView.setScaleType(ScaleType.MATRIX);
        imgs[i] = imageView;
      }

    }

    public int getCount() {
      if (imgs == null)
        return 0;
      else
        return imgs.length;
    }

    public Object getItem(int position) {
      return position;
    }

    public long getItemId(int position) {
      return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
      return imgs[position];
    }

  }
}
